﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using TumbaloSoft.Helpers;

namespace TumbaloSoft.Controllers
{
    public class DepartamentoController : TumbaloController
    {
        private static Object lockObject = new Object();
        public ActionResult Nuevo(int? prIdEdificio)
        {
            if (defaultAction != null) return defaultAction;

            if (!prIdEdificio.HasValue) return HttpNotFound();
            Departamento dpto = new Departamento();
            dpto.prEdificio = new Edificio();
            dpto.prEdificio.prIdEdificio = prIdEdificio.Value;
            //para precargar el departamento con el edificio

            return View(dpto);
        }

        [HttpPost]
        public ActionResult Nuevo(Departamento dept)
        {
            if (defaultAction != null) return defaultAction;

            Edificio edif;
            try
            {
                IList lista = HelperTipoInmueble.selectAll();
                if (lista.Count != 0) dept.prTipoInmueble = (TipoInmueble)lista[0];
                edif = HelperEdificio.selectById(dept.prEdificio.prIdEdificio);
                dept.prEdificio = edif;
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un departamento ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            ModelState.Remove("prEdificio.prDireccion");
            ModelState.Remove("prEdificio.prNombre");
            dept.prDireccion = edif.prDireccion;
            ModelState.Remove("prDireccion");
            ModelState.Remove("prEdificio.prArea");
            ModelState.Remove("prEdificio.prNroPisos");
            ModelState.Remove("prEdificio.prMonto");
            if (ModelState.IsValid)
            {
                try
                {
                    lock (lockObject)
                    {
                        dept.prIdInmueble = HelperInmueble.SiguienteCodigo();
                        dept.prIdDepartamento = dept.prIdInmueble;
                        HelperDepartamento.insert(dept);
                    }
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al insertar un departamento ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.mensaje = "Se ingreso con exito el departamento con ID= "+dept.prIdDepartamento+" en el edificio= "+edif.prNombre;
                ViewBag.returnURL = "/edificios/modificar?id="+edif.prIdEdificio;
                return View("~/Views/Shared/Exito.cshtml");
            }
            return View(dept);
        }

        public ActionResult Modificar(int? id)
        {
            if (defaultAction != null) return defaultAction;

            if (id.HasValue)
            {
                Departamento dept;
                try
                {
                    dept = HelperDepartamento.selectById(id.Value);
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al cargar un departamento ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                return View(dept);
            }
            return HttpNotFound();
        }

        [HttpPost]
        public ActionResult Modificar(Departamento dept)
        {
            if (defaultAction != null) return defaultAction;

            Edificio edif;
            try
            {
                IList lista = HelperTipoInmueble.selectAll();
                if (lista.Count != 0) dept.prTipoInmueble = (TipoInmueble)lista[0];
                edif = HelperEdificio.selectById(dept.prEdificio.prIdEdificio);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un Edificio ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            dept.prEdificio = edif;
            ModelState.Remove("prEdificio.prDireccion");
            ModelState.Remove("prEdificio.prNombre");
            dept.prDireccion = edif.prDireccion;
            ModelState.Remove("prDireccion");
            ModelState.Remove("prEdificio.prArea");
            ModelState.Remove("prEdificio.prNroPisos");
            ModelState.Remove("prEdificio.prMonto");
            if (ModelState.IsValid)
            {
                try
                {
                    HelperDepartamento.update(dept);
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al modificar un departamento ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.mensaje = "Se modifico con exito el departamento con ID= " + dept.prIdDepartamento;
                ViewBag.returnURL = "/edificios/modificar?id=" + edif.prIdEdificio;
                return View("~/Views/Shared/Exito.cshtml");
            }
            return View(dept);
        }

        public ActionResult Eliminar(int? id)
        {
            if (defaultAction != null) return defaultAction;

            if (id.HasValue)
            {
                Departamento dept;
                try
                {
                    dept = HelperDepartamento.selectById(id.Value);
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al cargar un departamento ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                return View(dept);
            }
            return HttpNotFound();
        }

        [HttpPost]
        public ActionResult Eliminar(Departamento dept)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                HelperDepartamento.delete(dept);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al eliminar un departamento ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            ViewBag.mensaje = "Se elimino con exito el departamento con ID= " + dept.prIdDepartamento;
            ViewBag.returnURL = "/edificios/modificar?id=" + dept.prEdificio.prIdEdificio;
            return View("~/Views/Shared/Exito.cshtml");
        }

    }
}
